package com.dp.client.views.almacenes;

import java.util.List;

import com.dp.client.dto.AlmacenBusqueda;
import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.CiudadDTO;
import com.dp.client.dto.ContinenteDTO;
import com.dp.client.dto.PaisDTO;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.geograficos.IServiciosGeograficos;
import com.dp.client.servicios.geograficos.IServiciosGeograficosAsync;
import com.dp.client.util.Alerts;
import com.dp.shared.FieldVerifier;
import com.dp.shared.IGeografico;
import com.dp.shared.QueryGeografico;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.datepicker.client.DateBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.i18n.client.HasDirection.Direction;
import com.dp.client.views.Geografico;

public class AlmacenPrincipal extends Composite {
	private FlexTable almacenesTable;
	private Button btnBuscar;
	private Label lblCapacidadMinima;
	private Label lblDescripcion;
	private Label lblCapacidadMaxima;
	private TextBox txtCapacidadMinima;
	private TextBox txtCapacidadMaxima;
	private TextBox txtDescripcion;
	private Geografico geografico= new Geografico(-1);
	private CaptionPanel cptnpnlRegistro;
	
	public AlmacenPrincipal() {
		CaptionPanel upperPanel = new CaptionPanel();
		upperPanel.setCaptionText("Almacenes");
		
		initWidget(upperPanel);
		upperPanel.setSize("auto", "auto");
		VerticalPanel verticalPanel = new VerticalPanel();
		upperPanel.add(verticalPanel);
		
		HorizontalPanel horizontalPanel = new HorizontalPanel();
		verticalPanel.add(horizontalPanel);
		
		FlexTable flexTable = new FlexTable();
		horizontalPanel.add(flexTable);
		
		lblDescripcion = new Label("Descripci\u00F3n:");
		flexTable.setWidget(0, 0, lblDescripcion);
		
		txtDescripcion = new TextBox();
		flexTable.setWidget(0, 1, txtDescripcion);
		
		lblCapacidadMinima = new Label("Capacidad m\u00EDnima");
		lblCapacidadMinima.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
		flexTable.setWidget(1, 0, lblCapacidadMinima);
		
		txtCapacidadMinima = new TextBox();
		flexTable.setWidget(1, 1, txtCapacidadMinima);
		
		lblCapacidadMaxima = new Label("Capacidad m\u00E1xima");
		flexTable.setWidget(2, 0, lblCapacidadMaxima);
		
		txtCapacidadMaxima = new TextBox();
		flexTable.setWidget(2, 1, txtCapacidadMaxima);
		
		btnBuscar = new Button("Buscar");
		btnBuscar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				buscarAlmacen();
			}
		});
		flexTable.setWidget(4, 0, btnBuscar);
		
		cptnpnlRegistro = new CaptionPanel("Ubicacion");
		horizontalPanel.add(cptnpnlRegistro);
		cptnpnlRegistro.setSize("272px", "150px");
		
		//geografico = new Geografico(-1);
		cptnpnlRegistro.setContentWidget(geografico);
		geografico.setSize("5cm", "3cm");
		
		CaptionPanel cptnpnlNewPanel = new CaptionPanel("");
		verticalPanel.add(cptnpnlNewPanel);
		
		VerticalPanel verticalPanel_1 = new VerticalPanel();
		cptnpnlNewPanel.setContentWidget(verticalPanel_1);
		verticalPanel_1.setSize("100%", "3cm");
		
		HorizontalPanel horizontalPanel_2 = new HorizontalPanel();
		verticalPanel_1.add(horizontalPanel_2);
		
		Button btnCrearNuevo = new Button("Crear nuevo");
		horizontalPanel_2.add(btnCrearNuevo);
		
		Button btnRefrescar = new Button("Refrescar");
		btnRefrescar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				refrescarTabla();
			}
		});
		horizontalPanel_2.add(btnRefrescar);
		btnCrearNuevo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				AlmacenDialog almacenDialog = new AlmacenDialog(null);
				
				almacenDialog.center();
				almacenDialog.addCloseHandler(new CloseHandler<PopupPanel>() {
					@Override
					public void onClose(CloseEvent<PopupPanel> event) {
						refrescarTabla();
					}
				});
			}
		});
		
		almacenesTable = new FlexTable();
		verticalPanel_1.add(almacenesTable);
		almacenesTable.setWidth("100%");
		
		Label lblDescripcion_1 = new Label("Descripcion");
		almacenesTable.setWidget(0, 0, lblDescripcion_1);
		
		Label lblContinente_1 = new Label("Continente");
		almacenesTable.setWidget(0, 1, lblContinente_1);
		
		Label lblPais_1 = new Label("Pais");
		lblPais_1.setDirection(Direction.RTL);
		almacenesTable.setWidget(0, 2, lblPais_1);
		lblPais_1.setWidth("100%");
		
		Label lblCiudad_1 = new Label("Ciudad");
		lblCiudad_1.setDirection(Direction.RTL);
		almacenesTable.setWidget(0, 3, lblCiudad_1);
		
		Label lblLongitud_1 = new Label("Longitud");
		almacenesTable.setWidget(0, 4, lblLongitud_1);
		
		Label lblLatitud_1 = new Label("Latitud");
		lblLatitud_1.setDirection(Direction.RTL);
		almacenesTable.setWidget(0, 5, lblLatitud_1);
		
		Label lblCapMaxima_1 = new Label("Cap Maxima");
		almacenesTable.setWidget(0, 6, lblCapMaxima_1);
		
		Label lblCapDisponible = new Label("Cap Disponible");
		almacenesTable.setWidget(0, 7, lblCapDisponible);
		
		Label lblOperacioes = new Label("Operaciones");
		almacenesTable.setWidget(0, 8, lblOperacioes);
		
		//init
		refrescarTabla();
	}
	private void buscarAlmacen(){
		IServiciosAlmacenAsync serviciosAlmacen = GWT.create(IServiciosAlmacen.class);
		serviciosAlmacen.buscarAlmacen(readAlmacenParaBuscar(), new AsyncCallback<List<AlmacenDTO>>() {
			
			@Override
			public void onSuccess(List<AlmacenDTO> result) {
				setTablaAlmacenes(result);
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
		
	}
	private AlmacenBusqueda readAlmacenParaBuscar(){
		int capacidadMaxima = -1;
		if ( FieldVerifier.isInteger(txtCapacidadMaxima.getText() ) ) 
			capacidadMaxima=Integer.parseInt( txtCapacidadMaxima.getText() );
		
		int capacidadMinima = -1;
		if ( FieldVerifier.isInteger( txtCapacidadMinima.getText() ) )  
			capacidadMinima=Integer.parseInt( txtCapacidadMinima.getText() );
		int a=geografico.getIdCiudad();
		int b=geografico.getIdPais();
		int c=geografico.getIdContinente();	
		AlmacenBusqueda busqueda= new AlmacenBusqueda(
				capacidadMaxima,capacidadMinima,
				/*latitud*/0.0,/*longitud*/0.0,txtDescripcion.getText(),geografico.getIdCiudad(),
				geografico.getIdPais(),geografico.getIdContinente()
		);
		return busqueda;
	}
	private void refrescarTabla(){
		
		IServiciosAlmacenAsync serviciosAlmacen = GWT.create(IServiciosAlmacen.class);
		serviciosAlmacen.listAlmacenesConDatosEnTiempoReal(new AsyncCallback<List<AlmacenDTO>>() {
			
			@Override
			public void onSuccess(List<AlmacenDTO> result) {
				setTablaAlmacenes(result);
				//geografico=new Geografico(-1);
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}

	private void setTablaAlmacenes(List<AlmacenDTO> almacenes){
		while(almacenesTable.getRowCount() > 1) almacenesTable.removeRow(1);
		for(final AlmacenDTO almacen : almacenes){
			
			int row = almacenesTable.getRowCount();
			
			final int id = almacen.getId();
			almacenesTable.setText(row, 0, "" + almacen.getDescripcion());
			almacenesTable.setText(row, 1, almacen.getCiudad().getPais().getContinente().getNombre());
			almacenesTable.setText(row, 2, almacen.getCiudad().getPais().getNombre());
			almacenesTable.setText(row, 3, almacen.getCiudad().getNombre());
			almacenesTable.setText(row,  4,  almacen.getLongitud()+"");
			almacenesTable.setText(row, 5, "" +almacen.getLatitud());
			almacenesTable.setText(row, 6, almacen.getCapacidadMaxima()+"");
			almacenesTable.setText(row, 7, "" + almacen.getCapacidadDisponible());
			HorizontalPanel hor = new HorizontalPanel();
			hor.add(new Button("Mov", new ClickHandler(){
				public void onClick(ClickEvent event) {
					MovimientosAlmacen movimientosDialog = new MovimientosAlmacen(almacen);
					movimientosDialog.center();
				}
			}));
			hor.add(new Button("Modificar", new ClickHandler(){
				public void onClick(ClickEvent event) {
					AlmacenDialog almacenDialog = new AlmacenDialog(almacen);
					almacenDialog.center();
					almacenDialog.addCloseHandler(new CloseHandler<PopupPanel>() {
						@Override
						public void onClose(CloseEvent<PopupPanel> event) {
							refrescarTabla();
						}
					});
				}
			}));
			hor.add(new Button("Eliminar", new ClickHandler(){
				public void onClick(ClickEvent event) {
					IServiciosAlmacenAsync serviciosAlmacen = GWT.create(IServiciosAlmacen.class);
					serviciosAlmacen.eliminarAlmacen(id, new AsyncCallback<Boolean>() {
						
						@Override
						public void onSuccess(Boolean result) {
							Alerts.dialogExitoEliminacionDeObjeto("Almacen");
							refrescarTabla();
						}
						
						@Override
						public void onFailure(Throwable caught) {
							Alerts.dialogErrorConexion();
						}
					});
				}
			}));
			almacenesTable.setWidget(row, 8, hor);
		}
	}
	

}
